"use client"; import { useAutoAnimate } from "@formkit/auto-animate/react"; import { useEffect, useState } from "react"; import { useFormContext } from "react-hook-form"; import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired"; import SkeletonLoaderTeamList from "@calcom/features/ee/teams/components/SkeletonloaderTeamList"; import { CreateButtonWithTeamsList } from "@calcom/features/ee/teams/components/createButton/CreateButtonWithTeamsList"; import { FilterResults } from "@calcom/features/filters/components/FilterResults"; import { TeamsFilter } from "@calcom/features/filters/components/TeamsFilter"; import { getTeamsFiltersFromQuery } from "@calcom/features/filters/lib/getTeamsFiltersFromQuery"; import { ShellMain } from "@calcom/features/shell/Shell"; import { UpgradeTip } from "@calcom/features/tips"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { useHasPaidPlan } from "@calcom/lib/hooks/useHasPaidPlan"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { useRouterQuery } from "@calcom/lib/hooks/useRouterQuery"; import { trpc } from "@calcom/trpc/react"; import { ArrowButton } from "@calcom/ui/components/arrow-button"; import { Badge } from "@calcom/ui/components/badge"; import { Button } from "@calcom/ui/components/button"; import { ButtonGroup } from "@calcom/ui/components/buttonGroup"; import { EmptyScreen } from "@calcom/ui/components/empty-screen"; import { Icon } from "@calcom/ui/components/icon"; import { List, ListLinkItem } from "@calcom/ui/components/list"; import { Tooltip } from "@calcom/ui/components/tooltip"; import type { SetNewFormDialogState, NewFormDialogState } from "../../components/FormActions"; import { FormAction, FormActionsDropdown, FormActionsProvider } from "../../components/FormActions"; import { isFallbackRoute } from "../../lib/isFallbackRoute"; import type { RoutingFormWithResponseCount } from "../../types/types"; function NewFormButton({ setNewFormDialogState }: { setNewFormDialogState: SetNewFormDialogState }) { const { t } = useLocale(); return ( { setNewFormDialogState({ action: "new", target: teamId ? String(teamId) : "" }); }} /> ); } export default function RoutingForms({ appUrl }: { appUrl: string }) { const { t } = useLocale(); const { hasPaidPlan } = useHasPaidPlan(); const routerQuery = useRouterQuery(); const hookForm = useFormContext(); const utils = trpc.useUtils(); const [parent] = useAutoAnimate(); const mutation = trpc.viewer.loggedInViewerRouter.routingFormOrder.useMutation({ onError: async (err) => { console.error(err.message); await utils.viewer.appRoutingForms.forms.cancel(); await utils.viewer.appRoutingForms.invalidate(); }, onSettled: () => { utils.viewer.appRoutingForms.invalidate(); }, }); useEffect(() => { hookForm.reset({}); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const filters = getTeamsFiltersFromQuery(routerQuery); const queryRes = trpc.viewer.appRoutingForms.forms.useQuery({ filters, }); const [newFormDialogState, setNewFormDialogState] = useState(null); const forms = queryRes.data?.filtered; const features = [ { icon: , title: t("create_your_first_form"), description: t("create_your_first_form_description"), }, { icon: , title: t("create_your_first_route"), description: t("route_to_the_right_person"), }, { icon: , title: t("reporting"), description: t("reporting_feature"), }, { icon: , title: t("test_routing_form"), description: t("test_preview_description"), }, { icon: , title: t("routing_forms_send_email_owner"), description: t("routing_forms_send_email_owner_description"), }, { icon: , title: t("download_responses"), description: t("download_responses_description"), }, ]; async function moveRoutingForm(index: number, increment: 1 | -1) { const types = forms?.map((type) => { return type.form; }); if (types?.length) { const newList = [...types]; const type = types[index]; const tmp = types[index + increment]; if (tmp) { newList[index] = tmp; newList[index + increment] = type; } await utils.viewer.appRoutingForms.forms.cancel(); mutation.mutate({ ids: newList?.map((type) => type.id), }); } } return ( ) : null } subtitle={t("routing_forms_description")}> } buttons={
}>
} /> } noResultsScreen={ } SkeletonLoader={SkeletonLoaderTeamList}>
{forms?.map(({ form, readOnly, hasError }, index) => { // Make the form read only if it has an error // TODO: Consider showing error in UI so user can report and get it fixed. readOnly = readOnly || hasError; if (!form) { return null; } const description = form.description || ""; form.routes = form.routes || []; const fields = form.fields || []; const userRoutes = form.routes.filter((route) => !isFallbackRoute(route)); const firstItem = forms[0].form; const lastItem = forms[forms.length - 1].form; return (
{!(firstItem && firstItem.id === form.id) && ( moveRoutingForm(index, -1)} arrowDirection="up" /> )} {!(lastItem && lastItem.id === form.id) && ( moveRoutingForm(index, 1)} arrowDirection="down" /> )} {form.team?.name && (
{form.team.name}
)} {t("edit")} {t("download_responses")} {t("duplicate")} {t("delete")} }>
{fields.length} {fields.length === 1 ? "field" : "fields"} {userRoutes.length} {userRoutes.length === 1 ? "route" : "routes"} {form._count.responses}{" "} {form._count.responses === 1 ? "response" : "responses"}
); })}
); }